#include <stdio.h>
#include <stdlib.h>

// 定义栈的最大容量
#define MAX_SIZE 100

// 顺序栈结构体
typedef struct Stack {
    int data[MAX_SIZE];
    int top;
} Stack;

// 初始化栈
void initStack(Stack *s) {
    s->top = -1;
}

// 判断栈是否为空
int isEmpty(Stack *s) {
    return s->top == -1;
}

// 判断栈是否已满
int isFull(Stack *s) {
    return s->top == MAX_SIZE - 1;
}

// 入栈操作
void push(Stack *s, int value) {
    if (isFull(s)) {
        printf("Stack is full.\n");
        return;
    }
    s->data[++(s->top)] = value;
}

// 出栈操作
int pop(Stack *s) {
    if (isEmpty(s)) {
        printf("Stack is empty.\n");
        return -1; // 这里可以根据实际情况返回一个特殊值表示错误
    }
    return s->data[(s->top)--];
}

// 读取栈顶元素（不弹出）
int peek(Stack *s) {
    if (isEmpty(s)) {
        printf("Stack is empty.\n");
        return -1; // 同样，返回特殊值表示错误
    }
    return s->data[s->top];
}

// 打印栈中的所有元素
void printStack(Stack *s) {
    if (isEmpty(s)) {
        printf("Stack is empty.\n");
        return;
    }
    printf("Stack elements: ");
    for (int i = 0; i <= s->top; i++) {
        printf("%d ", s->data[i]);
    }
    printf("\n");
}

int main() {
    Stack stack;
    initStack(&stack);

    push(&stack, 10);
    push(&stack, 20);
    push(&stack, 30);

    printStack(&stack);

    printf("Popped element: %d\n", pop(&stack));

    printStack(&stack);

    printf("Top element: %d\n", peek(&stack));

    return 0;
}